package pruebas;

import modelo.*;
import modelo.armas.*;
import modelo.moviles.exceptions.ArmaSinBalas;
import modelo.moviles.balas.Bala;
import junit.framework.TestCase;


 public class TestArma extends TestCase {
	
	/* "testea el arma de tipo Cohete" */
	public void testCohete(){
		Arma arma;
		Bala bala;
		
		arma = new Cohete(new Nivel(10 , 12));
		
		/* 	"cuando inicia el arma debe poder disparar" */
		assertTrue("El Cohete no fue bien creado",arma.puedeDisparar()) ;

		/* Empezamos el try que debera saltar en el ultimo caso */
		try {
			
		/* "cuando dispara una bala, esa debe ser de tipo BalaCohete 
		 * y por ende tener una intensidad de 100" */
		bala = arma.disparar();
		assertEquals("El Cohete no dispara las balas correspondientes",bala.getIntensidad() , 100); 

		/* "el cohete contiene 2 balas, una vez que disparo las 2 no debe poder soltar mas"*/ 
		bala = arma.disparar();
		assertFalse("El Cohete puede disparar mas de 2 balas",arma.puedeDisparar()); 

		arma.disparar();
		fail("Disparo aunque estaba vacio");
		} catch (ArmaSinBalas expected) {
		    	/* Esta parte esta de mas, solo queria probar la excepcion.*/
	    }
		
	}

	/* "testea el arma de tipo Laser" */
	public void testLaser(){

		Arma arma;
		Bala bala;
		arma = new Laser(new Nivel(10 , 12));
		
		/*"cuando inicia el arma debe poder disparar"*/
		assertTrue("El Laser no fue bien creado",arma.puedeDisparar()); 

		/* Empezamos el try que no debera saltar */
		try {
		
			/* "cuando suelta una bala esa debe ser de tipo BalaLaser 
			 * y por ende tener una intensidad de 30" */
			bala = arma.disparar();
			assertEquals("El Laser no larga las balas correspondientes",bala.getIntensidad(), 30);
	
			/* "el laser siempre tiene balas, disparamos 25 y vemos que sigue teniendo" */
			for (int i =1; i < 26; i++){
				bala = arma.disparar();
			}
		
		} catch (ArmaSinBalas expected) {
			fail("Se quedo sin balas cuando no debia");
		}
		assertTrue("El Laser no se puede quedar sin balas",arma.puedeDisparar());
	}

	/* 	"testea el arma de tipo TorpedoRastreador"*/
	public void testTorpedoRastreador(){

		Arma arma;
		Bala bala;
		arma = new TorpedoRastreador (new Nivel(10 , 12));
		

		/*"cuando inicia el arma debe poder disparar"*/
		assertTrue("El Laser no fue bien creado",arma.puedeDisparar()); 

		/* Empezamos el try que debera saltar en el ultimo caso */
		try {
			
			/* "cuando dispara una bala, esa debe ser de tipo BalaTorpedoRastreador 
			 * y por ende tener una intensidad de 35" */
			bala = arma.disparar();
			assertEquals("El TorpedoRastreador no larga las balas correspondientes",bala.getIntensidad(), 35);

			/* "el TorpedoRastreador contiene 5 balas, 
			 * una vez que disparo las 5 no debe poder soltar mas"
			 */
			for (int i = 1; i < 5; i++ ){
				bala = arma.disparar();
			}
			assertFalse("El TorpedoRastreador puede largar mas de 5 balas", arma.puedeDisparar());

			bala = arma.disparar();
			fail("Disparo aunque estaba vacio");
		} catch (ArmaSinBalas expected) {
		    	/* Esta parte esta de mas, solo queria probar la excepcion.*/
	    }
	}

	/* "testea el arma de tipo TorpedoSimple" */
	public void testTorpedoSimple(){

		Arma arma;
		Bala bala;
		arma = new TorpedoSimple (new Nivel(10 , 12));
		

		/*"cuando inicia el arma debe poder disparar"*/
		assertTrue("El TorpedoSimple no fue bien creado",arma.puedeDisparar()); 

		/* Empezamos el try que debera saltar en el ultimo caso */
		try {
			
			/* "cuando dispara una bala, esa debe ser de tipo BalaTorpedoSimple 
			 * y por ende tener una intensidad de 40" */
			bala = arma.disparar();
			assertEquals("El TorpedoSimple no larga las balas correspondientes",bala.getIntensidad(), 40);

			
			/* "el TorpedoSimple contiene 10 balas, 
			 * una vez que disparo las 10 no debe poder soltar mas"
			 */
			for (int i = 1; i < 10; i++ ){
				bala = arma.disparar();
			}
			assertFalse("El TorpedoRastreador puede largar mas de 10 balas", arma.puedeDisparar());

			bala = arma.disparar();
			fail("Disparo aunque estaba vacio");
		} catch (ArmaSinBalas expected) {
		    	/* Esta parte esta de mas, solo queria probar la excepcion.*/
	    }

	}
}
